/*
 * Copyright 2010 - 2011, The PLDesktop Development Team
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

#include <kernel/PLObject.h>

using namespace PLSDK;

#include <kernel/signalslot/lang/PLConnectionData.h>
#include <kernel/signalslot/lang/PLSignalBase.h>
#define PLHASHTABLE_DISABLE_PLOBJECT
#include <tools/PLHashTable.h>

PLObject::PLObject() : m_senders(0), m_index(0) {
}

PLObject::~PLObject() {
	if(m_senders) {
		disconnect_all();
		delete m_senders;
	}
}

void PLObject::disconnect_all() {
	if(m_senders) {
		PLHashTableKeyEnumerator<pluint64, PLConnectionData *> en = m_senders->keyEnumerator();
		pluint64 key;
		while(en.hasNext()) {
			key = en.next();
			PLConnectionData *data = m_senders->get(key);
			if(data) {
				if(data->signal()) {
					data->signal()->removeSignal(key);
				}
				delete data;
				data = 0;
			}
		}
	}
}

pluint64 PLObject::connect(PLConnectionData *data) {
	if(m_senders == 0) {
		m_senders = new PLHashTable<pluint64, PLConnectionData *>(1);
	}
	m_senders->insert(m_index, data);
	m_index++;
	return m_index - 1;
}

#undef PLHASHTABLE_DISABLE_PLOBJECT
